package org.nw.utils;

import nc.vo.pub.VOStatus;

import org.apache.commons.lang.StringUtils;
import org.nw.dao.NWDao;
import org.nw.service.sys.CodeRuleService;
import org.nw.service.sys.impl.CodeRuleServiceImpl;
import org.nw.vo.sys.CodeRuleVO;
import org.nw.vo.sys.CodenoVO;
import org.nw.web.utils.WebUtils;

import com.uft.webnc.util.DateUtils;

/**
 * 编码工具类，根据规则生成编码
 * 
 * @author xuqc
 * @date 2012-7-28 上午10:26:48
 */
public class CodenoHelper {

	public static String generateCode(String fun_code) {
		if(StringUtils.isBlank(fun_code)) {
			return null;
		}
		CodeRuleService ruleService = new CodeRuleServiceImpl();
		CodeRuleVO ruleVO = ruleService.getByFunCode(fun_code);
		if(ruleVO == null) {
			// 没有定义规则
			return null;
		}
		StringBuffer codeno = new StringBuffer();
		if(StringUtils.isNotBlank(ruleVO.getPrefix())) {
			codeno.append(ruleVO.getPrefix());
		}
		if(ruleVO.getIs_year().booleanValue()) {
			codeno.append(DateUtils.getYear());
		}
		if(ruleVO.getIs_month().booleanValue()) {
			codeno.append(DateUtils.getMonth());
		}
		if(ruleVO.getIs_day().booleanValue()) {
			codeno.append(DateUtils.getDay());
		}
		if(ruleVO.getIs_serial_no().booleanValue()) {
			// 流水号位数
			codeno.append(getSerialno(fun_code, ruleVO.getSerial_no_count()));
		}
		return codeno.toString();
	}

	/**
	 * 返回可用的流水号，如果当前的单据类型已经存在流水号，则返回流水号+1，否则返回1， 返回的数值需要根据位数进行补齐，如0001
	 * 
	 * @param fun_code
	 * @param serial_no_count
	 *            //流水号的位数
	 * @return
	 */
	private static String getSerialno(String fun_code, int serial_no_count) {
		NWDao dao = NWDao.getInstance();
		String where = "isnull(dr,0)=0 and fun_code=? and pk_corp=?";
		CodenoVO codenoVO = dao.queryByCondition(CodenoVO.class, where, fun_code, WebUtils.getLoginInfo().getPk_corp());
		int serialno; // 流水号
		if(codenoVO == null) {
			// 此时还没有流水号，
			serialno = 1;
			codenoVO = new CodenoVO();
			codenoVO.setFun_code(fun_code);
			codenoVO.setSerial_no(serialno);
			codenoVO.setPk_corp(WebUtils.getLoginInfo().getPk_corp());
			codenoVO.setStatus(VOStatus.NEW);
			NWDao.setUuidPrimaryKey(codenoVO);
		} else {
			serialno = codenoVO.getSerial_no() + 1;
			codenoVO.setSerial_no(serialno);
			codenoVO.setStatus(VOStatus.UPDATED);
		}
		dao.saveOrUpdate(codenoVO);
		StringBuffer sb = new StringBuffer(serialno + "");
		int length = sb.length();
		// 如果位数不够，补0
		for(int i = 0; i < (serial_no_count - length); i++) {
			sb.insert(0, "0");
		}
		return sb.toString();
	}
}
